//
//  MCHomeViewController.swift
//  HXWeibo
//
//  Created by HX on 15/11/23.
//  Copyright © 2015年 HX. All rights reserved.
//

import UIKit

import AFNetworking

import SVProgressHUD

// 管理cell的重用标识
enum MCStatusReuseIdentifier: String
{
    case NormalCell = "NormalCell"
    case ForwardCell = "ForwardCell"
}

class MCHomeViewController: MCBaseTableViewController
{
    // MARK: - 属性
    
    /// 要显示的微博数据
    var statuses: [MCStatus]?
        {
            didSet
            {
                // 立马显示新数据 刷新tableView的数据
                tableView.reloadData()
            }
        }
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        // 判断用户已经登录，才设置导航栏的按钮
        if !userloagin
        {// 如果没有登录就直接return,不用设置导航栏按钮
            return
        }
        
        setupNav()
        
        prepareTableView()
        
        loadStatus()
    }
    
    // 下拉刷新,加载新的微博数据
    func loadStatus()
    {
        print("------------------------开始加载微博数据")
        
        // 当第一次进入程序的时候 statuses为nil
        let since_id = statuses?.first?.id ?? 0
        
        // 测试加载微博数据
        MCStatus.loadStatus(since_id, max_id: 0 ) { (statuses, error) -> () in
            
            //不管有没有数据，都关掉刷新控件
            self.refreshControl?.endRefreshing()
            
            if error != nil
            {
//                print("error--->\(error)")
                
                SVProgressHUD.showErrorWithStatus("网络不给力!~")
                
                return
            }
            
            let count = statuses?.count ?? 0
            
            print("加载到的微博数据--->\(count)")
            
            //需要判断的下拉刷新还是第一次加载20条数据
            if count == 0
            {
                //如果没有新数据,直接return
                return
            }
            
            if since_id > 0//加载新的数据
            {
                // 可选 不能进行操作，需要拆包
                self.statuses = statuses! + self.statuses!
                
                print("~~~~~~~~~~~~~~~~~~加载到新的微博数据共:\(self.statuses?.count)条数据")
            }
            else// 第一次加载20条数据
            {
                // 赋值给属性
                self.statuses = statuses
                
                print("首次加载最新:\(self.statuses?.count)条微博数据")
                
                print("what are you 弄啥呢?~")
            }
        }
    }
    
    private func prepareTableView()
    {
        // 根据显示的模型，返回对应类型的cell
        // 注册原创cell
        tableView.registerClass(MCStatusNormalCell.self, forCellReuseIdentifier: MCStatusReuseIdentifier.NormalCell.rawValue)
        
        // 注册转发cell
        tableView.registerClass(MCStatusForwardCell.self, forCellReuseIdentifier: MCStatusReuseIdentifier.ForwardCell.rawValue)
        
        // 取消cell的分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        // Autolayout来自动约束cell的高度
        // 预估行高,可以减少cell计算的次数，加快cell内容的显示,但是没有显示的cell，在即将显示的时候需要计算,如果计算比较复杂，在拖动cell的时候，有可能不够流畅
        tableView.estimatedRowHeight = 200

//        // 设置行高,根据cell的约束来自动确定cell的高度
//        tableView.rowHeight = UITableViewAutomaticDimension
        
        // refresh:刷新 refreshControl(系统的)
        refreshControl = MCRefreshControl()
        
//        print("refreshControl-->\(refreshControl)")
        
        // 当刷新控件进入刷新状态时调用
        refreshControl?.addTarget(self, action: "loadStatus", forControlEvents: UIControlEvents.ValueChanged)
        
        //主动开始刷新数据
        //beginRefreshing,只会让刷新控件进入刷新状态
        refreshControl?.beginRefreshing()
        
        refreshControl?.sendActionsForControlEvents(UIControlEvents.ValueChanged)
        
//        // 测试添加控件到系统的refreshControl
//        let view = UIView()
//        
//        view.backgroundColor = UIColor.orangeColor()
//        
//        view.frame = CGRect(x: 0, y: 0, width: 200, height: 30)
//        
//        refreshControl?.addSubview(view)
        
//        // 把系统的菊花颜色设置成透明的，隐藏体统的菊花
//        refreshControl?.tintColor = UIColor.clearColor()
    }
    
    // MARK: - 设置导航栏
    private func setupNav()
    {
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageNamed: "navigationbar_friendsearch")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageNamed: "navigationbar_pop")
        
        // ??
        let screen_name = MCUserAccount.loadUserAccount()?.screen_name ?? "xxx"
        
        let homeTitleBtn = MCHomeTitleBtn(title: screen_name)
        
        navigationItem.titleView = homeTitleBtn
        
        homeTitleBtn.addTarget(self, action: "homeTitleBtnClick:", forControlEvents: UIControlEvents.TouchUpInside)
        
    }
    
    /**
     标题按钮点击事件
     */
    func homeTitleBtnClick(btn: UIButton)
    {
        btn.selected = !btn.selected
        
        // 根据按钮的选中状态显示菜单窗口,改变箭头的方向
        // UIView旋转动画: 就近原则 如果旋转 270: 360 -270 = 90, 如果两边一样远,会顺时针
        UIView.animateWithDuration(0.25) { () -> Void in

            btn.imageView?.transform = btn.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.01)) : CGAffineTransformIdentity
        }
    }
    // MARK: - tableView代理方法
    /// 返回对应cell的行高
    //行高调用比较频繁，会多次调用
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    {
        // 先看看有没有缓存的行高，如果有缓存行高，直接用，没有的话在计算，并缓存起来
        // 获取对应的模型
        let status = statuses![indexPath.row]
        
        // 如果有缓存行高
        if status.rowHeight != nil
        {
            print("返回缓存的行高 --> \(indexPath)  rowHeight --> \(status.rowHeight)")
            
            return status.rowHeight!
        }
        // 没有缓存行高
        //获取cell 计算行高
        let cell = tableView.dequeueReusableCellWithIdentifier(status.cellId()) as! MCStatusCell
        
        //cell计算行高
        let rowHeight = cell.rowHeight(status)
        
        // 缓存行高
        status.rowHeight = rowHeight
        
        //返回行高
//        print("计算行高-->indexPatch --> \(indexPath) rowHeight--> \(rowHeight)")
        
        return rowHeight
    }
    
    // MARK: - tableView数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        // 获得模型,只有模型知道要显示什么样的cell
        let status = statuses![indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier(status.cellId()) as! MCStatusCell
        
//        cell.textLabel?.text = statuses![indexPath.row].text
        
        cell.status = status
        
        return cell
    }
}


































